#include "house.h"
#include "monitor.h"
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void iniciaCasa(DadosPersonagem dados[])
{
	strcpy(dados[0].nome, "Sheldon");
	dados[0].numero = 0;
	strcpy(dados[1].nome, "Amy");
	dados[1].numero = 1;
	strcpy(dados[2].nome, "Leonard");
	dados[2].numero = 2;
	strcpy(dados[3].nome, "Penny");
	dados[3].numero = 3;
	strcpy(dados[4].nome, "Howard");
	dados[4].numero = 4;
	strcpy(dados[5].nome, "Bernardette");
	dados[5].numero = 5;
}

void iniciaEscalonamento()
{
	pthread_t t_personagem[NUM_MAX_REQUERENTES_FORNO]; //thread personagens
	pthread_t t_mediador; //thread mediador - Raj;
	Monitor m;
	Personagem numt_personagem[NUM_MAX_REQUERENTES_FORNO]; //Array de personagens
	Personagem mediador; // Mediador - Raj
	pthread_attr_t attr;
	pthread_attr_init(&attr);
	pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
	iniciaMonitor(&m);
	iniciaMediador(&m, &mediador);


	int i;
	for (i = 0; i < NUM_MAX_REQUERENTES_FORNO; i++)
	{
		numt_personagem[i].m = &m;
		numt_personagem[i].num_cliente = i;
		numt_personagem[i].quantidadeUsoForno = 0;
	}

	//Cria a thread do mediador Raj
	pthread_create(&t_mediador, &attr, (void *)criaMediador, (void *) &mediador);

	for (i = 0; i < NUM_MAX_REQUERENTES_FORNO; i++)
	{
		esperar();
		pthread_create(&t_personagem[i], &attr, (void *)personagens, (void *) &numt_personagem[i]);
	}

	pthread_join(t_mediador, NULL);
	for (i = 0; i < NUM_MAX_REQUERENTES_FORNO; i++) pthread_join(t_personagem[i], NULL);
}

void iniciaFila()
{
	int i;
	for(i = 0; i < 1000; i++) fila[i] = -1;
}

void adicionaFila(int numero)
{
	//Se não existe na fila, adiciona
	if(!verificaSeExisteNaFila(numero))
	{
		int i;
		for(i = 0; i < 1000; i++)
		{
			if(fila[i] == -1)
			{
				fila[i] = numero;
				break;
			}
		}
	}
}
void removeFila(int numero)
{
	int i, j, condicao = 1;
	for(i = 0, j = 0; i < 1000; i++, j++)
	{
		if(fila[i] == numero && condicao)
		{
			i++;
			condicao = 0;
		}
		fila[j] = fila[i];
	}

	//trata ultima posição da fila
	if(j != i) fila[j] = -1;
}

void imprimeFila(int tamanho)
{
	int i;
	for(i = 0; i < tamanho; i++) printf("%d  ", fila[i]);
	printf("\n");
}

int removePrimeiroDaFila()
{
	int numero = fila[0]; //primeira posição
	removeFila(numero);
	return numero;
}

int verificaSeExisteNaFila(int numero)
{
	int i;
	for(i = 0; i < 1000; i++)
	{
		if(fila[i] == numero)
		{
			return 1;
		}
	}
	return 0;
}
